#ifndef MYTCPSOCKET_H
#define MYTCPSOCKET_H

// **
//
// 自定义的QTcpSocket类
//   该类对QTcpsocket再次封装，主要用于多客户端情况下拆包组包，本质上是带有拆包组包功能的QTcpSocket
//   继承MsgPackage类，用于处理接收的消息
//
// created by yiyefangzhou24
// created time 2023/1/5
//
// **

#include <QObject>
#include <QtNetwork>
#include "msgpackage.h"

class MyTcpSocket : public QObject, public MsgPackage
{
    Q_OBJECT
public:
    MyTcpSocket();

    // 重载构造函数，用于初始化socket句柄和客户端信息
    MyTcpSocket(QTcpSocket * s);

    // 初始化socket和客户端相关信息
    void init(QTcpSocket * s);

    // 获取socket句柄
    QTcpSocket * getTcpSocket();

    // 封包并发送数据
    void send(QByteArray data);

    // 重载比较运算符== ，socket句柄相同则类相同
    bool operator==(const MyTcpSocket &A);

    // 重载父类虚函数，接收到一次完整包的响应函数
    void pkgReady(QByteArray data) override;

    // 获取peerAddress
    QString getPeerAddr();

    // 获取peerPort
    int getPeerPort();

    // 获取peerName
    QString getPeerName();

    // 获取客户端描述符
    int getDescriptor();

    // 获取客户端延时
    int getDelay();

    // 设置peerAddress
    void setPeerAddr(QString peerAddr);

    // 设置peerPort
    void setPeerPort(int peerPort);

    // 设置peerName
    void setPeerName(QString peerName);

    // 设置客户端描述符
    void setDescriptor(int descriptor);

    // 设置客户端延时
    void setDelay(int delay);

signals:

    // 自定义信号，通知调用者收到一次完整的数据包
    void sigPkgReady(QByteArray data, MyTcpSocket * sender);

private:

    QString peerAddr;           //客户端ip地址

    unsigned int peerPort;      //客户端端口号

    QString peerName;           //客户端名称

    int descriptor;              //客户端描述符

    int delay;                  //客户端延时

    QTcpSocket * socket;      // socket句柄类
};

#endif // MYTCPSOCKET_H
